<?php
namespace app\admin\controller;

use app\BaseController;

use app\admin\service\admin\Auth as AuthService;
use app\common\exception\BaseException;

class Base extends BaseController
{
	// 后台登录信息
    protected $loginInfo;
    // 免登录访问地址白名单
    protected array $allowapi=[
        // 登录
        'login/index', 
        // 退出登录
        'login/logout',
        // 获取用户详情
        'admin.user/info',
        // 账户设置
        'admin.user/updateInfo',
    ];

    /**
     * 后台初始化
     * @return void
     * @throws BaseException
     */
    public function initialize(): void
    {
        $this->setStoreInfo();
    	$this->checkLogin();
    	$this->checkPrivilege();
    }

    /**
     * 设置管理员登录信息
     */
    private function setStoreInfo(): void
    {
        $this->loginInfo = (new AuthService)->getLoginInfo();
    }

    /**
     * 验证登录状态
     * @return void
     * @throws BaseException
     */
    private function checkLogin(): void
    {
        
        // 验证当前请求是否在白名单
        if (in_array(strtolower($this->routeUri),array_map('strtolower',$this->allowapi))) {
            return;
        }
        // 验证登录状态
        if (empty($this->loginInfo) || (int)$this->loginInfo['is_login'] !== 1) {
            throwError('请先登录', config('status.not_logged'));
        }
    }

    /**
     * 验证当前路由权限
     * @return void
     * @throws BaseException
     */
    private function checkPrivilege(): void
    {   
       
    	// 验证当前请求是否在白名单
        if (in_array(strtolower($this->routeUri),array_map('strtolower',$this->allowapi))) {
            return;
        }

        // 在开发模式下, 建议把此处代码暂时屏蔽, 开发完成后在超管后台新增菜单和api
        if (!(new AuthService)->checkPrivilege('/' . strtolower($this->routeUri))) {
            throwError('很抱歉，没有访问权限 ' . $this->routeUri);
        }
    }
}
